package com.maidada.mddaichat.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * JWT工具类
 *
 * @author wulinxuan
 * @date 2025-04-16 16:42
 */
public class JwtUtils {

    private static final String SECRET_KEY = "sijidazao";

    // 过期时间（单位：毫秒，示例为 1 小时）
    private static final long EXPIRATION_TIME = 60 * 60 * 24 * 7 * 1000;

    /**
     * 生成 JWT Token
     *
     * @param userId 用户唯一标识（例如用户 ID）
     * @return 生成的 JWT Token
     */
    public static String generateToken(String userId) {
        return JWT.create()
                .withSubject(userId)
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .withIssuedAt(new Date())
                .sign(Algorithm.HMAC256(SECRET_KEY));
    }

    /**
     * 解析并验证 JWT Token
     *
     * @param token JWT Token
     * @return 解码后的 JWT 对象
     * @throws JWTVerificationException 如果 Token 验证失败
     */
    public static DecodedJWT verifyToken(String token) throws JWTVerificationException {
        return JWT.require(Algorithm.HMAC256(SECRET_KEY))
                .build()
                .verify(token);
    }

    /**
     * 获取 Token 中的用户信息（主题）
     *
     * @param token JWT Token
     * @return 用户唯一标识（例如用户 ID）
     */
    public static String getUserIdFromToken(String token) {
        DecodedJWT decodedJWT = verifyToken(token);
        return decodedJWT.getSubject();
    }

    /**
     * 检查 Token 是否已过期
     *
     * @param token JWT Token
     * @return true 表示已过期，false 表示未过期
     */
    public static boolean isTokenExpired(String token) {
        try {
            DecodedJWT decodedJWT = verifyToken(token);
            Date expirationDate = decodedJWT.getExpiresAt();
            return expirationDate.before(new Date());
        } catch (JWTVerificationException e) {
            return true;
        }
    }
}